/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package futbol.tacticas.concursantes.aitkiar.aitutil;

import futbol.tacticas.Comando;
import futbol.tacticas.ComandoGolpearBola;
import futbol.tacticas.ComandoIrA;
import futbol.tacticas.ComandoTiroAPuerta;
import futbol.tacticas.SituacionJugadores;
import java.awt.Point;

/**
 *
 * @author aitkiar
 */
public class Defensa extends Jugador
{

    private int cotaMarcaje = 30;
    private int zonaDeMarca = -20;
    
    public Defensa( int x, int y, int fuerza, int numero )
    {
        super( x, y, fuerza, numero );
        defensivo = true;
    }

    /** Comportamiento de los defensas.
     * 
     * Pase:
     * Si un defensa es el que está en posición de disparo hace un pase. Si está centrado, dará prioridad
     * en la eurística a los pases hacia las bandas ( más difícil de interceptar ). Si está en una banda,
     * dará prioridad a la precisión del pase.
     * 
     * Colocación en el campo:
     * Si no es el jugador más cercano a la bola, tenderán a irse lo lo más cerca posible de un contrario
     * y a seguirlo un poco por delante: x-5
     * 
     * @param sj
     * @return
     */
    @Override
    public Comando getComando( SituacionJugadores sj )
    {
        Point bola;
        Comando comando;
        Point misJugadores[] = sj.getMisJugadores();
        posicion = misJugadores[numero];
        Point contrarioMasCercano = campo.getMarcaje( numero );
        bola = sj.getBola();

        if ( Utils.disparo( posicion, sj ) )
        {
            if ( posicion.y < 80 && posicion.y > -80 )
            {
                //Despeje a una banda
                comando = new ComandoTiroAPuerta( numero, posicion.y > 0 ? 240 : -240 );
            }
            else
            {
                Point pase = getPase( sj );
                comando = new ComandoGolpearBola( numero, pase.x, pase.y );
                equipo[sj.getMiJugadorMasCerca(pase.x, pase.y)].notificaPase( fuerza, pase );
            }
        }
        else if ( notificacionPase > 0 && puntoPase != null )
        {
            notificacionPase --;
            comando = new ComandoIrA( this.numero, puntoPase.getX(), puntoPase.getY() );
        }
        else if ( campo.getJugadorMasCercanoBola() == numero )
        {
            comando = new ComandoIrA( this.numero, bola.getX(), bola.getY() );
            notificacionPase = 0;
            puntoPase = null;
        }
        else if ( defensivo && contrarioMasCercano != null )
        {
            comando = new ComandoIrA( this.numero, contrarioMasCercano.x + 5, contrarioMasCercano.y );
            notificacionPase = 0;
            puntoPase = null;
        }
        else if ( !defensivo && bola.x < campo.jugadores[numero].x )
        {
            comando = new ComandoIrA( numero, bola.x, bola.y );
        }
        else if ( bola.x > zonaDeMarca && Utils.ultimaBola != null && Utils.ultimaBola.x < bola.x )
        {
            Point desmarque = getMejorDesmarque( sj );
            comando = new ComandoIrA( this.numero, desmarque.x, desmarque.y );
        }
        else
        {
            comando = new ComandoIrA( this.numero, x, y );
            notificacionPase = 0;
            puntoPase = null;
        }
        return comando;
    }
    
    /** Un defensa tiene que tener una penalización alta por cambiar de posición y al desmarcarse y 
     * otra al alejarse de la zona de marca.
     * 
     * @param sj
     * @return
     */
    public int heuristicaDesmarqueClase( SituacionJugadores sj, ZonaCampo zona )
    {
        int heuristica = 0;
        
        if ( zona.x > zonaDeMarca )
        {
            heuristica += zonaDeMarca - zona.x;
        }
        
        heuristica -= Math.abs( zona.y - y ) * 2;
        return heuristica;
    }

    @Override
    public int heuristicaPaseClase( SituacionJugadores sj, ZonaCampo zona )
    {
        int heuristica = 0;
        
        heuristica += zona.pase.x - posicion.x;
        
        return heuristica;
    }
}
